package com.pe.pgn.clubpgn.webapp.controller;

import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbEmpresaCelular;
import com.pe.pgn.clubpgn.domain.ClpbEstadoCivil;
import com.pe.pgn.clubpgn.domain.ClpbTipoDocumentoPersona;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.service.AfiliacionService;
import com.pe.pgn.clubpgn.service.ClientePersonaService;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

/**
 * @author Edwin Farfan
 */

@Controller
@RequestMapping("/clientePersona/**")
public class ClientePersonaController extends BaseFormController{

	@Autowired
	private ClientePersonaService clientePersonaService;

	@Autowired
	private AfiliacionService afiliacionService;
	
	@RequestMapping(value = "/clientePersonaList.html")
    public @ModelAttribute("clientePersonaList") BNClientesPersona listarClientesPersonas(
    		@ModelAttribute("clientePersonaList") BNClientesPersona cliente,
    		@RequestParam(value = "search", required = false) String search,Model model) {

		List<BNClientesPersona> clientePersona = null;		
		try {			
	
			if(StringUtils.isBlank(search)){			
				clientePersona = clientePersonaService.obtenerBNClientePersonas();
			}else{				
				clientePersona = clientePersonaService.busquedaClientesPorFiltros
				(cliente.getCoCodeNumeroDocumento(), cliente.getDeNombre(),
				cliente.getEliminado(), cliente.getHabilitado(), cliente.getFechaInicio(), cliente.getFechaFin());	
			}
			
		} catch (Exception e) {
			System.out.println(" Excepcion listarClientesPersonas: "+e.getMessage());
		}		
		
		model.addAttribute("clientePersonas", clientePersona);
		model.addAttribute("clientePersonaList", cliente);		
		model.addAttribute("fecha_inscripcion_date_format", CLPConstantes.DATE_PATTERN);
		return cliente;
    }
	
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/clientePersonaForm.html", method = RequestMethod.GET)
	public @ModelAttribute("clientePersona") BNClientesPersona verClientePersona(
				@RequestParam(value = "id", required = false) Long id, HttpServletRequest request,ModelMap modelMap) {

		List listDep  = null;
		List listProv = null;
		List listDist = null;
		
		List<ClpbEstadoCivil> estadoCivil = clientePersonaService.listadoEstadoCivil();
		List<ClpbEmpresaCelular> empresaCelular = clientePersonaService.listadoEmpresaCelular();
		List<ClpbTipoDocumentoPersona> tipoDocumento = clientePersonaService.listadoDocumentoPersonas();
		
		modelMap.addAttribute("tipoDocumentoPersona"	, tipoDocumento);
		modelMap.addAttribute("empresaCelular"			, empresaCelular);
		modelMap.addAttribute("estadocivil"				, estadoCivil);

		if (id != null) {
			
			BNClientesPersona clientePersona = clientePersonaService.obtenerClientePersona(id);
			if(StringUtils.isBlank(clientePersona.getCoDepartamento())){
				
				listDep = afiliacionService.findDepartamentosUbigeo(false);		
				ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
				
				listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
				ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
				
				listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
				
			}else{
				
				listDep  = afiliacionService.findDepartamentosUbigeo(false);				
				listProv = afiliacionService.findPronvinciaUbigeo(clientePersona.getCoDepartamento().toString(), false);				
				listDist = afiliacionService.findDistritoUbigeo(clientePersona.getCoDepartamento().toString(),clientePersona.getCoProvincia().toString(), false);
			}		
			
			modelMap.addAttribute("listadepartamento"		, listDep);
			modelMap.addAttribute("listaprovincia"			, listProv);
			modelMap.addAttribute("listadistrito"			, listDist);
			return clientePersona;
		}

		listDep = afiliacionService.findDepartamentosUbigeo(false);		
		ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
		
		listProv = afiliacionService.findPronvinciaUbigeo(dep.getCoDepartamento().toString(), false);
		ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
		
		listDist = afiliacionService.findDistritoUbigeo(dep.getCoDepartamento().toString(),prov.getCoProvincia().toString(), false);
		
		modelMap.addAttribute("listadepartamento"		, listDep);
		modelMap.addAttribute("listaprovincia"			, listProv);
		modelMap.addAttribute("listadistrito"			, listDist);        
		return new BNClientesPersona();
	}
	
	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/clientePersonaForm.html", method = RequestMethod.POST)
	public String guardarClientePersona(@ModelAttribute("clientePersona") BNClientesPersona clientePersona,
			BindingResult result, SessionStatus status, HttpServletRequest request, Model modelMap) {

		try {
			
			List listDep  = null;
			List listProv = null;
			List listDist = null;
			
			BNClientesPersona bnClientePersonaInicial = clientePersona;
			if(ValidationUtil.isValidateString(clientePersona.getCoDepartamento())){
				
				listDep  = afiliacionService.findDepartamentosUbigeo(false);				
				listProv = afiliacionService.findPronvinciaUbigeo(clientePersona.getCoDepartamento(),false);				
				listDist = afiliacionService.findDistritoUbigeo(clientePersona.getCoDepartamento(),clientePersona.getCoProvincia(),false);
				
			}else{
				
				String coDepartamento = "";
				String coProvincia	  = "";
				
				///////////////////////////////////////////////////////////
				listDep = afiliacionService.findDepartamentosUbigeo(false);		
				for (int i = 0; i < listDep.size(); i++) {					
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(i);					
					if(dep.getDeDepartamento().trim().equalsIgnoreCase("lima")){
						coDepartamento = dep.getCoDepartamento().toString();
						break;
					}
				}
				
				if("".equals(coDepartamento)){
					ClpmUbigeo dep = (ClpmUbigeo)listDep.get(0);
					coDepartamento = dep.getCoDepartamento().toString();
				}
				
				/////////////////////////////////////////////////////////////////////////
				listProv = afiliacionService.findPronvinciaUbigeo(coDepartamento, false);
				for (int i = 0; i < listProv.size(); i++) {					
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(i);					
					if(prov.getDeProvincia().trim().equalsIgnoreCase("lima")){
						coProvincia = prov.getCoProvincia().toString();
						break;
					}
				}
				
				if("".equals(coProvincia)){
					ClpmUbigeo prov = (ClpmUbigeo)listProv.get(0);
					coProvincia = prov.getCoProvincia().toString();
				}
				
				listDist = afiliacionService.findDistritoUbigeo(coDepartamento,coProvincia, false);
			}
			
			List<ClpbEstadoCivil> estadoCivil = clientePersonaService.listadoEstadoCivil();
			List<ClpbEmpresaCelular> empresaCelular = clientePersonaService.listadoEmpresaCelular();
			List<ClpbTipoDocumentoPersona> tipoDocumento = clientePersonaService.listadoDocumentoPersonas();
			
			modelMap.addAttribute("clientePersona" 			, bnClientePersonaInicial);
			modelMap.addAttribute("tipoDocumentoPersona"	, tipoDocumento);
			modelMap.addAttribute("empresaCelular"			, empresaCelular);
			modelMap.addAttribute("estadocivil"				, estadoCivil);
			modelMap.addAttribute("listadepartamento"		, listDep);
			modelMap.addAttribute("listaprovincia"			, listProv);
			modelMap.addAttribute("listadistrito"			, listDist);
			
			if (result.hasErrors()) {
				return "/clientePersona/clientePersonaForm";
			}
			
			String tipodoc 	   	   = clientePersona.getCoTipoDocumento();
	        String estadocivil 	   = clientePersona.getCoEstadoCivil();
	        String empresacelular  = clientePersona.getCoEmpresaCelular();
	        String fechaNacimiento = clientePersona.getFechaNacimiento();
			String documento 	   = clientePersona.getCoCodeNumeroDocumento();

			String coDepartamento  = clientePersona.getCoDepartamento();
	        String coProvincia 	   = clientePersona.getCoProvincia();
	        String coDistrito 	   = clientePersona.getCoDistrito();	        
	        
	        boolean isOlder = false;
	        Calendar fecNacimiento = null;	        
        	ClpmUbigeo clpmUbigeo  = afiliacionService.getUbigeo(coDepartamento,coProvincia,coDistrito);
        	clientePersona.setClpmUbigeo(clpmUbigeo);        	
	        
        	ClpbClientePersona cliente = new ClpbClientePersona();
	        BeanUtils.copyProperties(clientePersona, cliente);
	        
	        if(StringUtils.isBlank(cliente.getDeNombre())
	        		||StringUtils.isBlank(cliente.getDeApePaterno())
	        		||StringUtils.isBlank(cliente.getDeApeMaterno())){
	        	
	        	saveError(request, getText("common.campo.obligatorio", request.getLocale()));
	        	return "/clientePersona/clientePersonaForm";
	        }
	        
	        if(NumberUtils.isDigits(documento)){
	        	List<Map<String,Object>> listaDocumento=clientePersonaService.verificarDuplicidadDocumento(documento);
	        	if(!listaDocumento.isEmpty() && cliente.getId()==null){
	        		saveError(request, getText("mensaje.numero.documento.repetido", request.getLocale()));
	        		return "/clientePersona/clientePersonaForm";
	        	}
	        }else{
	        	saveError(request, getText("valida.formato.numero.documento", request.getLocale()));
	        	return "/clientePersona/clientePersonaForm";
	        }
	        
	        try{
	        	fecNacimiento = CalendarUtil.stringToCalendar
	        	(CLPConstantes.DATE_PATTERN, fechaNacimiento);
	        	cliente.setDaFechaNacimiento(fecNacimiento);
	        }catch(Exception e){
	        	saveError(request, getText("afiliacionform.novalidafechanacimiento", request.getLocale()));
	        	return "/clientePersona/clientePersonaForm";
	        }
	        
	        isOlder = ValidationUtil.isOlder(fecNacimiento);
	        if(!isOlder){
	        	saveError(request, getText("afiliacionform.noisolder", request.getLocale()));
	        	return "/clientePersona/clientePersonaForm";
	        }
		    
	        if(!validaLongitudDocumento(request,tipodoc, documento )){
	        	return "/clientePersona/clientePersonaForm";
	        }
        
	        if(StringUtils.isNotBlank(tipodoc)){
	        	ClpbTipoDocumentoPersona clpbTipoDocumentoPersona = new ClpbTipoDocumentoPersona();
	        	clpbTipoDocumentoPersona.setId(new Long(tipodoc));
	        	cliente.setClpbTipoDocumentoPersona(clpbTipoDocumentoPersona);
	        }
	        
	        if(StringUtils.isNotBlank(estadocivil)){
	        	ClpbEstadoCivil clpbEstadoCivil = new ClpbEstadoCivil();
	        	clpbEstadoCivil.setId(new Long(estadocivil));
	        	cliente.setClpbEstadoCivil(clpbEstadoCivil);
	        }
	        
	        
	        if(StringUtils.isNotBlank(empresacelular)){
	        	ClpbEmpresaCelular clpbEmpresaCelular = new ClpbEmpresaCelular();
	        	clpbEmpresaCelular.setId(new Long(empresacelular));
	        	cliente.setClpbEmpresaCelular(clpbEmpresaCelular);
	        }
	        
	        cliente.setStClientePersona(Boolean.TRUE);
	        
			clientePersonaService.guardarClientePersona(cliente);
			saveMessage(request, getText("clientePersonaform.added", 
					clientePersona.toString().substring(0, CLPConstantes.LIMITE_CADENA)
					.concat(CLPConstantes.PUNTOS_SUSPENSIVOS), 
					request.getLocale()));
			return "redirect:clientePersonaList.html";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/clientePersona/clientePersonaForm";
		}

	}	
	
	@RequestMapping(value = "/eliminarClientePersona.html")
	public String eliminarClientePersona(@RequestParam(value = "id", required = false) Long id, 
			HttpServletRequest request) {

		try {
			if(id !=null){
			boolean dependencias= clientePersonaService.clienteTieneDependencias(id);
			
				if(!dependencias){
					clientePersonaService.eliminarClientePersona(id);
					saveMessage(request, getText("clientePersonaForm.deleted", request.getLocale()));
				}else{
					saveError(request, getText("cliente.persona.tiene.dependencia", request.getLocale()));
				}
			}
			return "redirect:clientePersonaList.html";
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/clientePersona/clientePersonaForm";
		}
	}		

    public boolean validaLongitudDocumento(HttpServletRequest request, String tipoDocumento,String numeroDocumento ){
    	
    	//si es que el tipo de documento es DNI
        int longitud= clientePersonaService.validaDocumento(new Long(tipoDocumento ));
    	if(numeroDocumento.length() != longitud){
    		saveError(request, getText("numero.no.coincide", String.valueOf(longitud),request.getLocale()));
			return false;
    	}
    	return true;
    }
}
